package com.cskaoyan.javase.oop1._7constructor;
/**
 * 总结一下到目前为止给成员变量赋值的方式：
 * "掐头去尾"原则
 * 在所有给成员变量赋值的方式当中，默认初始化具有默认值，永远是第一步。这是"头"
 * 在所有给成员变量赋值的方式当中，构造器赋值是最后一步。这是"尾"
 *
 * 现在中间的赋值方式，只学习过一种，就是显式赋值，直接在成员变量的定义后面写它的值。
 *
 * 通过debug模式，查看成员变量的赋值顺序，是非常好的，也很直观。
 * 
 * @since 10:08
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo2{
    public static void main(String[] args){
        Student stu = new Student(18,"王冰冰");
        System.out.println(stu.age);
        System.out.println(stu.name);
        System.out.println(stu.a);
        /*
            debug模式查看赋值顺序：
                debug模式中，变量前面的标识：
                    p：parameter 参数的意思，一般指的是方法的形参
                    f: field 字段，它是一个数据库中的概念，对应数据库的一列，对应Java中的成员变量
                1.首先默认初始化，首先所有成员变量具有默认值。
                2.接下来先找到创建对象时，使用的构造器。如果该构造器中，有this调用别的构造器，先执行this构造器
                3.this构造器也不会立刻执行，而是按照代码的书写顺序从上到下，先执行成员变量的显式赋值。
                4.显式赋值执行完毕后，再执行this构造器
                5.this构造器执行完毕后，再执行创建对象的那个构造器
                6.完毕，构造器代码最后执行，赋值正确。

         */
    }
}
class Student {
    int age = 10;
    String name = "张三";
    double a = 100;

    public Student(int age) {
        System.out.println("Student age");
        this.age = age;
    }

    public Student() {
    }

    public Student(int age, String name) {
        this(age);
        System.out.println("Student age,name");
        this.name = name;
    }
}